﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;

namespace RobotGerchik.DataClass.BaseTransaqCalss
{
    /// <summary>
    /// Стоп ордеры
    /// Передается автоматически после установки соединения, а так же после
    /// изменения какого-либо из полей. В последнем случае передаются только
    /// изменившиеся поля. В таких сообщениях для условных заявок
    /// идентификатором является transactionid, для всех остальных – oderno.
    /// Transactionid - это идентификатор транзакции сервера Transaq, неизменность
    /// которого гарантируется внутри текущего сеанса связи с сервером. Он служит
    /// для идентификации условных заявок, а также заявок, отклоненных Биржей.
    /// После выставления заявки на биржу, ей присваивается параметр orderno -
    /// это постоянный идентификатор заявки, который не меняется вплоть до
    /// окончания биржевой торговой сессии.
    /// </summary>
    public class StopOrder : INotifyPropertyChanged
    {
        #region Private

        #region Общие
        private int _transactionid;
        private long _activeorderno;
        private int _secid;
        private string _board;
        private string _seccode;
        private string _client;
        private string _buysell;
        private string _canceller;

        private long _alltradeno;
        private DateTime _validbefore;
        private string _author;
        private DateTime _accepttime;
        private long _linkedorderno;
        private DateTime _expdate;
        private string _status;
        #endregion

        #region StopLoss

        private string _slUseCredit;
        private double _slActivationPrice;
        private DateTime _slGuardTime;
        private string _slBrokerref;
        private int _slQuantity;
        private string _slbymarket;
        private double _slOrderPrice;

        #endregion

        #region TakeProfit

        private double _tpActivationPrice;
        private DateTime _tpGuardTime;
        private string _tpBrokerref;
        private int _tpQuantity;
        private double _tpExtremum;
        private double _tpLevel;
        private double _tpCorrection;
        private double _tpGuardSpread;

        #endregion

        #endregion

        #region Public

        #region Общие
        /// <summary>
        /// идентификатор транзакции сервера Transaq
        /// </summary>
        public int Transactionid
        {
            get { return _transactionid; }
            set
            {
                if (_transactionid != value)
                {
                    _transactionid = value;
                    RaisePropertyChanged("Transactionid");
                }
            }
        }

        /// <summary>
        /// номер заявки Биржевой регистрационный номер заявки, выставленной на рынок в результате исполнения cтопа.
        /// </summary>
        public long Activeorderno
        {
            get { return _activeorderno; }
            set
            {
                if (_activeorderno != value)
                {
                    _activeorderno = value;
                    RaisePropertyChanged("Activeorderno");
                }
            }
        }

        /// <summary>
        /// идентификатор бумаги
        /// </summary>
        public int Secid
        {
            get { return _secid; }
            set
            {
                if (_secid != value)
                {
                    _secid = value;
                    RaisePropertyChanged("Secid");
                }
            }
        }

        /// <summary>
        /// идентификатор борда
        /// </summary>
        public string Board
        {
            get { return _board; }
            set
            {
                if (_board != value)
                {
                    _board = value;
                    RaisePropertyChanged("Board");
                }
            }
        }

        /// <summary>
        /// код инструмента
        /// </summary>
        public string Seccode
        {
            get { return _seccode; }
            set
            {
                if (_seccode != value)
                {
                    _seccode = value;
                    RaisePropertyChanged("Seccode");
                }
            }
        }

        /// <summary>
        /// идентификатор клиента
        /// </summary>
        public string Client
        {
            get { return _client; }
            set
            {
                if (_client != value)
                {
                    _client = value;
                    RaisePropertyChanged("Client");
                }
            }
        }
        /// <summary>
        /// идентификатор трейдера, который отменил стоп.
        /// Значение status cancelled означает, что заявка находится в процессе снятия.
        /// </summary>
        public string Canceller
        {
            get { return _canceller; }
            set
            {
                if (_canceller != value)
                {
                    _canceller = value;
                    RaisePropertyChanged("Canceller");
                }
            }
        }
        /// <summary>
        /// покупка (B) / продажа (S)
        /// </summary>
        public string Buysell
        {
            get { return _buysell; }
            set
            {
                if (_buysell != value)
                {
                    _buysell = value;
                    RaisePropertyChanged("Buysell");
                }
            }
        }
        /// <summary>
        /// биржевой регистрационный номер сделки, явившейся основанием для перехода стопа в текущее состояние.
        /// </summary>
        public long Alltradeno
        {
            get { return _alltradeno; }
            set
            {
                if (_alltradeno != value)
                {
                    _alltradeno = value;
                    RaisePropertyChanged("Alltradeno");
                }
            }
        }

        /// <summary>
        /// до какого момента действительно (см. newcondorder)
        /// </summary>
        public DateTime Validbefore
        {
            get { return _validbefore; }
            set
            {
                if (_validbefore != value)
                {
                    _validbefore = value;
                    RaisePropertyChanged("Validbefore");
                }
            }
        }

        /// <summary>
        /// 
        /// </summary>
        public string Author
        {
            get { return _author; }
            set
            {
                if (_author != value)
                {
                    _author = value;
                    RaisePropertyChanged("Author");
                }
            }
        }

        /// <summary>
        /// время регистрации заявки сервером Transaq (только для условных заявок)
        /// </summary>
        public DateTime Accepttime
        {
            get { return _accepttime; }
            set
            {
                if (_accepttime != value)
                {
                    _accepttime = value;
                    RaisePropertyChanged("Accepttime");
                }
            }
        }

        /// <summary>
        /// 
        /// </summary>
        public long Linkedorderno
        {
            get { return _linkedorderno; }
            set
            {
                if (_linkedorderno != value)
                {
                    _linkedorderno = value;
                    RaisePropertyChanged("Linkedorderno");
                }
            }
        }

        /// <summary>
        /// дата экспирации (только для ФОРТС)
        /// </summary>
        public DateTime Expdate
        {
            get { return _expdate; }
            set
            {
                if (_expdate != value)
                {
                    _expdate = value;
                    RaisePropertyChanged("Expdate");
                }
            }
        }

        /// <summary>
        /// статус заявки стоп заявки
        /// </summary>
        public string Status
        {
            get { return _status; }
            set
            {
                if (_status != value)
                {
                    _status = value;
                    RaisePropertyChanged("Status");
                }
            }
        }
        #endregion

        #region СтопЛосс
        /// <summary>
        /// 
        /// </summary>
        public string SlUseCredit
        {
            get { return _slUseCredit; }
            set
            {
                if (_slUseCredit != value)
                {
                    _slUseCredit = value;
                    RaisePropertyChanged("SlUseCredit");
                }
            }
        }
        /// <summary>
        /// 
        /// </summary>
        public double SlActivationPrice
        {
            get { return _slActivationPrice; }
            set
            {
                if (_slActivationPrice != value)
                {
                    _slActivationPrice = value;
                    RaisePropertyChanged("SlActivationPrice");
                }
            }
        }
        /// <summary>
        /// 
        /// </summary>
        public DateTime SlGuardTime
        {
            get { return _slGuardTime; }
            set
            {
                if (_slGuardTime != value)
                {
                    _slGuardTime = value;
                    RaisePropertyChanged("SlGuardTime");
                }
            }
        }
        /// <summary>
        /// 
        /// </summary>
        public string SlBrokerref
        {
            get { return _slBrokerref; }
            set
            {
                if (_slBrokerref != value)
                {
                    _slBrokerref = value;
                    RaisePropertyChanged("SlBrokerref");
                }
            }
        }
        /// <summary>
        /// 
        /// </summary>
        public int SlQuantity
        {
            get { return _slQuantity; }
            set
            {
                if (_slQuantity != value)
                {
                    _slQuantity = value;
                    RaisePropertyChanged("SlQuantity");
                }
            }
        }
        /// <summary>
        /// 
        /// </summary>
        public string Slbymarket
        {
            get { return _slbymarket; }
            set
            {
                if (_slbymarket != value)
                {
                    _slbymarket = value;
                    RaisePropertyChanged("Slbymarket");
                }
            }
        }
        /// <summary>
        /// 
        /// </summary>
        public double SlOrderPrice
        {
            get { return _slOrderPrice; }
            set
            {
                if (_slOrderPrice != value)
                {
                    _slOrderPrice = value;
                    RaisePropertyChanged("SlOrderPrice");
                }
            }
        }

        #endregion

        #region TakeProfit

        /// <summary>
        /// 
        /// </summary>
        public double TpActivationPrice
        {
            get { return _tpActivationPrice; }
            set
            {
                if (_tpActivationPrice != value)
                {
                    _tpActivationPrice = value;
                    RaisePropertyChanged("TpActivationPrice");
                }
            }
        }
        /// <summary>
        /// 
        /// </summary>
        public DateTime TpGuardTime
        {
            get { return _tpGuardTime; }
            set
            {
                if (_tpGuardTime != value)
                {
                    _tpGuardTime = value;
                    RaisePropertyChanged("TpGuardTime");
                }
            }
        }
        /// <summary>
        /// 
        /// </summary>
        public string TpBrokerref
        {
            get { return _tpBrokerref; }
            set
            {
                if (_tpBrokerref != value)
                {
                    _tpBrokerref = value;
                    RaisePropertyChanged("TpBrokerref");
                }
            }
        }
        /// <summary>
        /// 
        /// </summary>
        public int TpQuantity
        {
            get { return _tpQuantity; }
            set
            {
                if (_tpQuantity != value)
                {
                    _tpQuantity = value;
                    RaisePropertyChanged("TpQuantity");
                }
            }
        }
        /// <summary>
        /// 
        /// </summary>
        public double TpExtremum
        {
            get { return _tpExtremum; }
            set
            {
                if (_tpExtremum != value)
                {
                    _tpExtremum = value;
                    RaisePropertyChanged("TpExtremum");
                }
            }
        }
        public double TpLevel
        {
            get { return _tpLevel; }
            set
            {
                if (_tpLevel != value)
                {
                    _tpLevel = value;
                    RaisePropertyChanged("TpLevel");
                }
            }
        }
        public double TpCorrection
        {
            get { return _tpCorrection; }
            set
            {
                if (_tpCorrection != value)
                {
                    _tpCorrection = value;
                    RaisePropertyChanged("TpCorrection");
                }
            }
        }
        public double TpGuardSpread
        {
            get { return _tpGuardSpread; }
            set
            {
                if (_tpGuardSpread != value)
                {
                    _tpGuardSpread = value;
                    RaisePropertyChanged("TpGuardSpread");
                }
            }
        }
        #endregion

        #endregion

        #region event PropertyChangedEventHandler

        public event PropertyChangedEventHandler PropertyChanged;

        protected void RaisePropertyChanged(string propertyName)
        {
            var handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        #endregion
    }
}
